#!/usr/bin/env bun

import { readFileSync, writeFileSync } from 'fs';

import { gitmojis } from 'gitmojis';

interface Gitmoji {
  emoji: string;
  code: string;
  description: string;
}

// 获取提交信息文件路径
const commitMsgFile: string | undefined = process.argv[2];

if (!commitMsgFile) {
  console.error('❌ 未提供提交信息文件路径');
  process.exit(1);
}

// 确保 commitMsgFile 不为 undefined
const filePath: string = commitMsgFile;

// 读取提交信息
let commitMsg: string;
try {
  // eslint-disable-next-line security/detect-non-literal-fs-filename
  commitMsg = readFileSync(filePath, 'utf8').trim();
} catch (error) {
  console.error('❌ 无法读取提交信息文件:', (error as Error).message);
  process.exit(1);
}

/**
 * 显示错误信息的函数
 */
function showErrorMessage(commitMsg: string): void {
  console.log('❌ 提交信息格式错误！请使用 Gitmoji 格式');
  console.log('');
  console.log(`当前提交信息: "${commitMsg}"`);
  console.log('');
  console.log('请使用 Gitmoji 格式: :emoji: 提交信息');
  console.log('');
  console.log('示例:');
  console.log('  :sparkles: 添加新功能');
  console.log('  :bug: 修复登录错误');
  console.log('  :memo: 更新文档');
  console.log('');
  console.log('💡 建议使用交互式提交: bun run commit');
  console.log('📖 详细指南: docs/GITMOJI_GUIDE.md');
  console.log('');
}

/**
 * 更新提交信息文件
 */
function updateCommitFile(content: string): void {
  // eslint-disable-next-line security/detect-non-literal-fs-filename
  writeFileSync(filePath, content, 'utf8');
}

/**
 * 验证提交信息格式
 */
function validateCommitMessage(message: string): boolean {
  // 检查是否为空
  if (!message || message.trim() === '') {
    return false;
  }

  // 匹配 :emoji_code: 格式，要求冒号后必须有至少一个空格
  const emojiCodeMatch = message.match(/^:([a-z0-9_+-]+):\s+(.+)/);
  if (emojiCodeMatch) {
    const emojiCode = emojiCodeMatch[1];
    // 去除两侧空格并压缩内部多余空格（保留换行符）
    const commitContent = emojiCodeMatch[2]?.trim().replace(/ +/g, ' ');

    // 检查提交内容是否为空
    if (!commitContent) {
      console.log('❌ 提交信息内容不能为空');
      return false;
    }

    // 检查 emoji 代码是否在 gitmojis 列表中
    const validEmoji = (gitmojis as readonly Gitmoji[]).find(
      g => g.code === `:${emojiCode}:`
    );
    if (validEmoji) {
      const cleanedMessage = `:${emojiCode}: ${commitContent}`;
      console.log(
        `✅ 提交信息格式正确: ${validEmoji.emoji} ${validEmoji.description}`
      );
      console.log(`📝 提交内容: "${commitContent}"`);

      // 如果格式化后的消息与原消息不同，更新提交信息文件
      if (cleanedMessage !== message) {
        updateCommitFile(cleanedMessage);
        console.log('🧹 已自动清理多余空格');
      }

      return true;
    }
  }

  // 检查是否直接使用了 emoji 字符，通过检查 gitmojis 列表中的 emoji
  // 遍历所有已知的 gitmoji emoji 来进行匹配
  for (const gitmoji of gitmojis as readonly Gitmoji[]) {
    if (message.startsWith(gitmoji.emoji + ' ')) {
      const commitContent = message
        .slice(gitmoji.emoji.length + 1)
        .trim()
        .replace(/ +/g, ' ');

      // 检查提交内容是否为空
      if (!commitContent) {
        console.log('❌ 提交信息内容不能为空');
        return false;
      }

      const cleanedMessage = `${gitmoji.emoji} ${commitContent}`;
      console.log(
        `✅ 提交信息格式正确: ${gitmoji.emoji} ${gitmoji.description}`
      );
      console.log(`📝 提交内容: "${commitContent}"`);

      // 如果格式化后的消息与原消息不同，更新提交信息文件
      if (cleanedMessage !== message) {
        updateCommitFile(cleanedMessage);
        console.log('🧹 已自动清理多余空格');
      }

      return true;
    }
  }

  return false;
}

// 验证提交信息
if (!validateCommitMessage(commitMsg)) {
  showErrorMessage(commitMsg);
  process.exit(1);
}
